// Copyright 2025 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <AggregateFunctions/AggregateFunctionFactory.h>
#include <AggregateFunctions/AggregateFunctionMinMaxWindow.h>
#include <AggregateFunctions/FactoryHelpers.h>
#include <AggregateFunctions/HelpersMinMaxAny.h>

namespace DB
{
namespace
{
AggregateFunctionPtr createAggregateFunctionMinForWindow(
    const Context & /* context not used */,
    const std::string & name,
    const DataTypes & argument_types,
    const Array & parameters)
{
    return AggregateFunctionPtr(
        createAggregateFunctionSingleValueForWindow<AggregateFunctionsSingleValue, AggregateFunctionMinDataForWindow>(
            name,
            argument_types,
            parameters));
}

AggregateFunctionPtr createAggregateFunctionMaxForWindow(
    const Context & /* context not used */,
    const std::string & name,
    const DataTypes & argument_types,
    const Array & parameters)
{
    return AggregateFunctionPtr(
        createAggregateFunctionSingleValueForWindow<AggregateFunctionsSingleValue, AggregateFunctionMaxDataForWindow>(
            name,
            argument_types,
            parameters));
}
} // namespace

void registerAggregateFunctionsMinMaxForWindow(AggregateFunctionFactory & factory)
{
    factory.registerFunction(
        "min_for_window",
        createAggregateFunctionMinForWindow,
        AggregateFunctionFactory::CaseInsensitive);
    factory.registerFunction(
        "max_for_window",
        createAggregateFunctionMaxForWindow,
        AggregateFunctionFactory::CaseInsensitive);
}
} // namespace DB
